home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 16
/
Aminet 16 (1996)(GTI - Schatztruhe)[!][Dec 1996].iso
/
Aminet
/
comm
/
term
/
term_source.lha
/
Extras
/
Source
/
term-source.lha
/
Console.c
< prev
next >
Wrap
C/C++ Source or Header
|
1996-10-20
|
26KB
|
1,427 lines
/*
** Console.c
**
** High-level terminal console routines
**
** Copyright © 1990-1996 by Olaf `Olsen' Barthel
** All Rights Reserved
**
** :ts=4
*/
#ifndef _GLOBAL_H
#include "Global.h"
#endif
/* Temporary console working buffer. */
STATIC UBYTE ConTempBuffer[512];
typedef VOID (* CALLBACK)(STRPTR,LONG);
/* How this stuff works:
*
* This file holds the text output routines. The main entry point is
* ConTransfer (actually a function pointer). This routine feeds the
* input buffer into XProtocolHostMon(), a callback routine of the
* currently active XPR library. Control then passes to ConProcess().
* The incoming data is filtered through the flow scanner (FlowFilter),
* passed through the capture routines (CaptureData), the script recorder
* (RememberOutputText) and the trap scanner (TrapFilter). The data then
* goes through the text processing routine ConProcessData (another
* function pointer) which processes the embedded control sequences and
* eventually feeds the raw text into ConDump (yet another function
* pointer). This routine does the final text output.
*/
/* GfxText(struct RastPort *RPort,STRPTR Buffer,LONG Length):
*
* Text output, if necessary switching from gfx font
* to current default font.
*/
STATIC VOID
GfxText(struct RastPort *RPort,STRPTR Buffer,LONG Length)
{
/* Character set modes. */
enum { MODE_STANDARD,MODE_GFX };
struct TextFont *Font;
WORD TextMode;
LONG SameMode;
/* Determine current text rendering mode. */
TextMode = GfxTable[Buffer[0]];
if(TextMode == MODE_GFX)
Font = GFX;
else
Font = TextFont;
SetFont(RPort,Font);
/* Reset number of characters in common mode. */
SameMode = 0;
/* Scan until all input is processed. */
do
{
/* Scan for characters in the current mode. */
while(GfxTable[Buffer[SameMode]] == TextMode && SameMode < Length)
SameMode++;
/* Output the text found. */
Text(RPort,Buffer,SameMode);
/* Decrement number of remaining bytes. */
Length -= SameMode;
/* Anything left? */
if(Length > 0)
{
/* Skip to next character. */
Buffer += SameMode;
SameMode = 0;
/* Change text output mode. */
if(TextMode == MODE_GFX)
{
TextMode = MODE_STANDARD;
Font = TextFont;
}
else
{
TextMode = MODE_GFX;
Font = GFX;
}
SetFont(RPort,Font);
}
}
while(Length > 0);
/* Reset font type. */
if(TextMode == MODE_GFX)
SetFont(RPort,TextFont);
}
/****************************************************************************/
/* ConTranslateSetup():
*
* Set up for buffer translation.
*/
STATIC VOID
ConTranslateSetup(struct TranslationHandle *Handle,STRPTR SourceBuffer,LONG SourceLen,STRPTR DestinationBuffer,LONG DestinationLen,struct TranslationEntry **Table)
{
Handle->LocalBuffer = NULL;
Handle->LocalLen = 0;
Handle->SourceBuffer = SourceBuffer;
Handle->SourceLen = SourceLen;
Handle->DestinationBuffer = DestinationBuffer;
Handle->DestinationLen = DestinationLen;
Handle->Table = Table;
}
/* ConTranslateBuffer(struct TranslationHandle *Handle):
*
* Translate buffer contents according to
* translation table contents.
*/
STATIC LONG
ConTranslateBuffer(struct TranslationHandle *Handle)
{
struct TranslationEntry *Entry;
LONG BytesWritten;
STRPTR Data;
Data = Handle->DestinationBuffer;
BytesWritten = 0;
/* Are we to return any translated data? */
while(Handle->LocalLen && BytesWritten < Handle->DestinationLen)
{
/* Decrement number of bytes in buffer. */
Handle->LocalLen--;
/* Return next character. */
*Data++ = *Handle->LocalBuffer++;
/* Add another byte. */
BytesWritten++;
}
/* Loop until done. */
while(Handle->SourceLen && BytesWritten < Handle->DestinationLen)
{
/* Another byte eaten. */
Handle->SourceLen--;
/* Get table entry. */
if(Entry = Handle->Table[*Handle->SourceBuffer++])
{
/* Copy to local data area. */
Handle->LocalBuffer = Entry->String;
Handle->LocalLen = Entry->Len;
/* Translate the data. */
while(Handle->LocalLen && BytesWritten < Handle->DestinationLen)
{
/* Decrement number of bytes in buffer. */
Handle->LocalLen--;
/* Return next character. */
*Data++ = *Handle->LocalBuffer++;
/* Add another byte. */
BytesWritten++;
}
}
}
return(BytesWritten);
}
/* ConOutputTranslate(STRPTR Buffer,LONG Size):
*
* Frontend for ConOutput(), including character translation.
*/
STATIC VOID
ConOutputTranslate(STRPTR Buffer,LONG Size)
{
struct TranslationHandle Handle;
UBYTE LocalBuffer[256];
/* Set up for translation. */
ConTranslateSetup(&Handle,Buffer,Size,LocalBuffer,sizeof(LocalBuffer),ReceiveTable);
/* Process and output the data. */
while(Size = ConTranslateBuffer(&Handle))
(* ConOutput)(LocalBuffer,Size);
}
/****************************************************************************/
/* ConOutputPrinter(STRPTR Buffer,LONG Size):
*
* Raw text output routine, printer capture flavour.
*/
STATIC VOID
ConOutputPrinter(STRPTR Buffer,LONG Size)
{
if(Write(PrinterCapture,Buffer,Size) != Size)
{
BlockWindows();
if(!ShowRequest(NULL,LocaleString(MSG_CONSOLE_ERROR_WRITING_TO_PRINTER_TXT),LocaleString(MSG_CONSOLE_IGNORE_CLOSE_PRINTER_TXT)))
ClosePrinterCapture(TRUE);
ReleaseWindows();
}
}
/* ConOutputGFX(STRPTR Buffer,LONG Size):
*
* Raw text output routine, GFX text flavour.
*/
STATIC VOID
ConOutputGFX(STRPTR Buffer,LONG Size)
{
LONG Offset;
/* Do we still have a character in the
* magnificient buffer?
*/
while(Size)
{
/* Cursor is positioned at
* the right hand side of the
* display. If auto-wrap is
* enabled, perform some
* kind of CR/LF, else leave
* the cursor where it is and
* quit the show.
*/
if(CursorX > LastPrintableColumn)
{
/* Wrap cursor. */
if(Config->EmulationConfig->LineWrap)
{
/* Move to beginning of next line. */
CursorX = 0;
DownLine();
/* Reposition cursor, don't redraw it. */
RepositionCursor();
}
else
{
/* Stop the cursor. */
CursorX = LastPrintableColumn;
/* Make it reappear. */
RepositionCursor();
return;
}
}
if((Offset = LastPrintableColumn + 1 - CursorX) > Size)
Offset = Size;
if(Config->EmulationConfig->InsertMode)
{
RasterShiftChar(Offset);
ScrollLineShiftChar(Offset);
ShiftChar(Offset);
}
RasterPutString(Buffer,Offset);
ScrollLinePutString(Offset);
if(FontScalingRequired)
PrintScaled(Buffer,Offset,CurrentFontScale);
else
GfxText(RPort,Buffer,Offset);
Buffer += Offset;
Size -= Offset;
CursorX += Offset;
}
RepositionCursor();
}
/* ConOutputNormal(STRPTR Buffer,LONG Size):
*
* Raw text output routine, normal text flavour.
*/
STATIC VOID
ConOutputNormal(STRPTR Buffer,LONG Size)
{
LONG Offset;
while(Size)
{
if(CursorX > LastPrintableColumn)
{
if(Config->EmulationConfig->LineWrap)
{
CursorX = 0;
DownLine();
RepositionCursor();
}
else
{
CursorX = LastPrintableColumn;
RepositionCursor();
return;
}
}
if((Offset = LastPrintableColumn + 1 - CursorX) > Size)
Offset = Size;
if(Config->EmulationConfig->InsertMode)
{
RasterShiftChar(Offset);
ScrollLineShiftChar(Offset);
ShiftChar(Offset);
}
RasterPutString(Buffer,Offset);
ScrollLinePutString(Offset);
if(FontScalingRequired)
PrintScaled(Buffer,Offset,CurrentFontScale);
else
Text(RPort,Buffer,Offset);
Buffer += Offset;
Size -= Offset;
CursorX += Offset;
}
RepositionCursor();
}
/****************************************************************************/
/* ConProcessDataTransExternal(STRPTR String,LONG Size):
*
* Process data, external emulation including translation flavour.
*/
STATIC VOID
ConProcessDataTransExternal(STRPTR String,LONG Size)
{
struct TranslationHandle Handle;
/* Set up for translation. */
ConTranslateSetup(&Handle,String,Size,ConTempBuffer,sizeof(ConTempBuffer) / 2,ReceiveTable);
if(StripBuffer)
{
LONG Len;
/* Process and output the data. */
while(Size = ConTranslateBuffer(&Handle))
{
XEmulatorWrite(XEM_IO,ConTempBuffer,Size);
XEM_HostData.Source = ConTempBuffer;
XEM_HostData.Destination = StripBuffer;
if(Len = XEmulatorHostMon(XEM_IO,&XEM_HostData,Size))
{
if(CaptureData)
(*CaptureData)(StripBuffer,Len);
}
}
}
else
{
/* Process and output the data. */
while(Size = ConTranslateBuffer(&Handle))
XEmulatorWrite(XEM_IO,ConTempBuffer,Size);
}
}
/* ConProcessDataExternal(STRPTR String,LONG Size):
*
* Process data, external emulation flavour.
*/
STATIC VOID
ConProcessDataExternal(STRPTR String,LONG Size)
{
XEmulatorWrite(XEM_IO,String,Size);
/* Build another string to contain
* the pure ASCII contents, i.e.
* not including any ESC control
* sequences.
*/
if(StripBuffer)
{
LONG Len;
XEM_HostData.Source = String;
XEM_HostData.Destination = StripBuffer;
if(Len = XEmulatorHostMon(XEM_IO,&XEM_HostData,Size))
{
if(CaptureData)
(*CaptureData)(StripBuffer,Len);
}
}
}
/* ConProcessDataGeneric(STRPTR String,LONG Size,Mask):
*
* Process data, generic flavour.
*/
STATIC VOID
ConProcessDataGeneric(STRPTR String,LONG Size,UBYTE Mask)
{
LONG Len = 0;
UBYTE c;
/* If still parsing a sequence,
* continue with it.
*/
if(InSequence)
{
while(Size--)
{
c = *String++ & Mask;
if(!(*AbortTable[c])(c))
{
InSequence = FALSE;
break;
}
}
}
/* Check which font we are in, if other than Topaz
* the only invalid char is a Null (0) which will
* display as a space if let to continue.
*/
if(Config->TerminalConfig->FontMode == FONT_STANDARD)
{
while(Size-- > 0)
{
if(IsPrintable[c = *String++ & Mask])
{
/* This character is associated with a
* special function (bell, xon, xoff, etc.).
*/
if(SpecialTable[c])
{
if(Len)
{
(*ConDump)(ConTempBuffer,Len);
Len = 0;
}
/* Does this character start
* a control sequence?
*/
if(InSequence = (*SpecialTable[c])(c))
{
while(Size-- > 0)
{
c = *String++ & Mask;
if(!(*AbortTable[c])(c))
{
InSequence = FALSE;
break;
}
}
}
}
else
{
/* Put the character into the buffer
* and flush it if necessary.
*/
ConTempBuffer[Len] = c;
if(Len++ == sizeof(ConTempBuffer))
{
(*ConDump)(ConTempBuffer,Len);
Len = 0;
}
}
}
}
}
else
{
while(Size-- > 0)
{
if(c = (*String++ & Mask))
{
/* This character is associated with a
* special function (bell, xon, xoff, etc.).
*/
if(SpecialTable[c])
{
if(Len)
{
(*ConDump)(ConTempBuffer,Len);
Len = 0;
}
if(InSequence = (*SpecialTable[c])(c))
{
while(Size-- > 0)
{
c = *String++ & Mask;
if(!(*AbortTable[c])(c))
{
InSequence = FALSE;
break;
}
}
}
}
else
{
/* Put the character into the buffer
* and flush it if necessary.
*/
ConTempBuffer[Len] = c;
if(Len++ == sizeof(ConTempBuffer))
{
(*ConDump)(ConTempBuffer,Len);
Len = 0;
}
}
}
}
}
if(Len)
(*ConDump)(ConTempBuffer,Len);
}
/* ConProcessData7(STRPTR String,LONG Size):
*
* Process data, 7 bit flavour.
*/
STATIC VOID
ConProcessData7(STRPTR String,LONG Size)
{
ConProcessDataGeneric(String,Size,0x7F);
}
/* ConProcessData8(STRPTR String,LONG Size):
*
* Process data, 8 bit flavour.
*/
STATIC VOID
ConProcessData8(STRPTR String,LONG Size)
{
LONG Len = 0;
UBYTE c;
if(InSequence)
{
while(Size--)
{
c = *String++;
if(!(*AbortTable[c])(c))
{
InSequence = FALSE;
break;
}
}
}
if(Config->TerminalConfig->FontMode == FONT_STANDARD)
{
while(Size-- > 0)
{
if(IsPrintable[c = *String++])
{
if(SpecialTable[c])
{
if(Len)
{
(*ConDump)(ConTempBuffer,Len);
Len = 0;
}
if(InSequence = (*SpecialTable[c])(c))
{
while(Size-- > 0)
{
c = *String++;
if(!(*AbortTable[c])(c))
{
InSequence = FALSE;
break;
}
}
}
}
else
{
ConTempBuffer[Len] = c;
if(Len++ == sizeof(ConTempBuffer))
{
(*ConDump)(ConTempBuffer,Len);
Len = 0;
}
}
}
}
}
else
{
while(Size-- > 0)
{
if(c = *String++)
{
if(SpecialTable[c])
{
if(Len)
{
(*ConDump)(ConTempBuffer,Len);
Len = 0;
}
if(InSequence = (*SpecialTable[c])(c))
{
while(Size-- > 0)
{
c = *String++;
if(!(*AbortTable[c])(c))
{
InSequence = FALSE;
break;
}
}
}
}
else
{
ConTempBuffer[Len] = c;
if(Len++ == sizeof(ConTempBuffer))
{
(*ConDump)(ConTempBuffer,Len);
Len = 0;
}
}
}
}
}
if(Len)
(*ConDump)(ConTempBuffer,Len);
}
/* ConProcessDataHexGeneric(STRPTR String,LONG Size,UBYTE Mask):
*
* Process data, hex mode flavour, generic version.
*/
STATIC VOID
ConProcessDataHexGeneric(STRPTR String,LONG Size,UBYTE Mask)
{
UBYTE DummyBuffer[40],c;
LONG Fit,Spaces,Current;
/* How many characters will fit into the line? */
Fit = (LastColumn + 1) / 4;
/* Which position are we currently in? */
Current = CursorX / 3;
/* Weird cursor position? */
if(Current >= Fit || (CursorX % 3))
{
ConProcessDataGeneric("\r\n",2,Mask);
Current = 0;
}
/* Check the font type. */
if(Config->TerminalConfig->FontMode == FONT_STANDARD)
{
while(Size-- > 0)
{
c = (*String++) & Mask;
Spaces = (Fit - Current) * 3 + Current - 3;
if(c > ' ' && c < 127)
LimitedSPrintf(sizeof(DummyBuffer),DummyBuffer,"%02lx \33[%ldC%lc\33[%ldD",c,Spaces,c,Spaces + 1);
else
LimitedSPrintf(sizeof(DummyBuffer),DummyBuffer,"%02lx \33[%ldC.\33[%ldD",c,Spaces,Spaces + 1);
ConProcessDataGeneric(DummyBuffer,strlen(DummyBuffer),Mask);
if(Current++ == Fit - 1)
{
Current = 0;
ConProcessDataGeneric("\r\n",2,Mask);
}
}
}
else
{
while(Size-- > 0)
{
c = (*String++) & Mask;
Spaces = (Fit - Current) * 3 + Current - 3;
if(c && c != ' ')
LimitedSPrintf(sizeof(DummyBuffer),DummyBuffer,"%02lx \33[%ldC%lc\33[%ldD",c,Spaces,c,Spaces + 1);
else
LimitedSPrintf(sizeof(DummyBuffer),DummyBuffer,"%02lx \33[%ldC.\33[%ldD",c,Spaces,Spaces + 1);
ConProcessDataGeneric(DummyBuffer,strlen(DummyBuffer),Mask);
if(Current++ == Fit - 1)
{
Current = 0;
ConProcessDataGeneric("\r\n",2,Mask);
}
}
}
}
/* ConProcessDataHex7(STRPTR String,LONG Size):
*
* Process data, hex mode flavour, seven bits.
*/
STATIC VOID
ConProcessDataHex7(STRPTR String,LONG Size)
{
ConProcessDataHexGeneric(String,Size,0x7F);
}
/* ConProcessDataHex8(STRPTR String,LONG Size):
*
* Process data, hex mode flavour, eight bits.
*/
STATIC VOID
ConProcessDataHex8(STRPTR String,LONG Size)
{
ConProcessDataHexGeneric(String,Size,0xFF);
}
/****************************************************************************/
/* ConTransferHost(STRPTR Buffer,LONG Len):
*
* Process data read from the serial line,
* special XPR flavour.
*/
STATIC VOID
ConTransferHost(STRPTR Buffer,LONG Len)
{
LONG MaxSize;
/* How much room is left? */
if(Buffer != ReadBuffer)
MaxSize = SerialBufferSize - ((LONG)Buffer - (LONG)ReadBuffer);
else
MaxSize = SerialBufferSize;
/* Let the XPR library take its share. */
Len = XProtocolHostMon(XprIO,Buffer,Len,MaxSize);
/* Did a file transfer start? */
if(TransferWindow)
TransferCleanup();
/* If the file transfer was aborted, flush the receive buffer. */
if(TransferAborted)
{
BlockWindows();
CompletelyFlushSerialRead();
ReleaseWindows();
TransferAborted = FALSE;
}
/* Reset these two. */
TransferFailed = TransferError = FALSE;
if(Len)
ConProcess(Buffer,Len);
}
/* ConRawOutput(STRPTR String):
*
* Bypass the `normal' ConOutput() data processing.
*/
STATIC VOID
ConRawOutput(STRPTR String)
{
CALLBACK ProcessData;
if(Config->SerialConfig->StripBit8)
ProcessData = (CALLBACK)ConProcessData7;
else
ProcessData = (CALLBACK)ConProcessData8;
ObtainSemaphore(&TerminalSemaphore);
if(Marking)
WindowMarkerStop();
ClearCursor();
(*ProcessData)(String,strlen(String));
DrawCursor();
ReleaseSemaphore(&TerminalSemaphore);
}
STATIC VOID
ConTransferHost_Translate_CR_LF(STRPTR String,LONG Size)
{
LONG MaxSize;
if(String != ReadBuffer)
MaxSize = SerialBufferSize - ((LONG)String - (LONG)ReadBuffer);
else
MaxSize = SerialBufferSize;
Size = XProtocolHostMon(XprIO,String,Size,MaxSize);
if(TransferWindow)
TransferCleanup();
if(Size > 0)
{
if(Size = (*Translate_CR_LF)(String,Size))
ConProcess(String,Size);
}
}
STATIC VOID
ConProcess_Translate_CR_LF(STRPTR String,LONG Size)
{
if(Size = (*Translate_CR_LF)(String,Size))
ConProcess(String,Size);
}
/* ConProcess(STRPTR String,LONG Size):
*
* This is the central entry point to the terminal window
* output routines. The incoming data is filtered through
* the flow scanner (FlowFilter), passed through the capture
* routines (CaptureData), the script recorder (RememberOutputText)
* and the trap scanner (TrapFilter).
*/
VOID
ConProcess(STRPTR String,LONG Size)
{
if(Size > 0)
{
/* Feed the flow filter. */
if(UseFlow)
Size = FlowFilter(String,Size,Config->SerialConfig->StripBit8 ? 0x7F : 0xFF);
/* In quiet mode no characters are echoed to the
* console window, they are just passed through
* the data flow filter. Usually, this mode is
* enabled by the dial panel.
*/
if(!ConsoleQuiet && Size > 0)
{
/* Capture the data. */
if(CaptureData && !XEmulatorBase)
{
if(Config->CaptureConfig->ConvertChars && Config->TerminalConfig->FontMode != FONT_STANDARD)
{
UBYTE LocalBuffer[BUFFER_LINE_MAX];
UBYTE *Src = String,*Dst,c;
ULONG Count,Len = Size;
while(Len > 0)
{
Count = MIN(BUFFER_LINE_MAX,Len);
Len -= Count;
Dst = LocalBuffer;
do
{
if(c = ISOConversion[*Src++])
*Dst++ = c;
else
*Dst++ = (UBYTE)'·';
}
while(--Count > 0);
if((Count = (ULONG)Dst - (ULONG)LocalBuffer) > 0)
(*CaptureData)(LocalBuffer,Count);
}
}
else
(*CaptureData)(String,Size);
}
/* Remember the data. */
if(RememberOutput)
RememberOutputText(String,Size);
/* Check the traps if necessary. */
if(WatchTraps)
TrapFilter(String,Size);
if(Marking)
WindowMarkerStop();
if(TerminalQueue)
{
struct DataMsg *Msg;
if(Msg = (struct DataMsg *)CreateMsgItem(sizeof(struct DataMsg) + Size))
{
Msg->Data = (APTR)(Msg + 1);
Msg->Size = Size;
CopyMem(String,Msg->Data,Msg->Size);
PutMsgItem(TerminalQueue,(struct MsgItem *)Msg);
return;
}
}
ClearCursor();
(*ConProcessData)(String,Size);
DrawCursor();
}
}
}
/* ConPrintf(STRPTR String,...):
*
* Output a string to the console.
*/
VOID
ConPrintf(STRPTR String,...)
{
UBYTE LocalBuffer[256];
va_list VarArgs;
if(Marking)
WindowMarkerStop();
va_start(VarArgs,String);
LimitedVSPrintf(sizeof(LocalBuffer),LocalBuffer,String,VarArgs);
va_end(VarArgs);
ConProcess(LocalBuffer,strlen(LocalBuffer));
}
/****************************************************************************/
/* ConProcessUpdate():
*
* Choose the right console data processing routine.
*/
VOID
ConProcessUpdate()
{
Forbid();
if(XEmulatorBase && Config->TerminalConfig->EmulationMode == EMULATION_EXTERNAL)
{
if(ReceiveTable)
ConProcessData = ConProcessDataTransExternal;
else
ConProcessData = ConProcessDataExternal;
}
else
{
if(Config->SerialConfig->StripBit8)
{
if(Config->TerminalConfig->EmulationMode == EMULATION_HEX)
ConProcessData = ConProcessDataHex7;
else
ConProcessData = ConProcessData7;
}
else
{
if(Config->TerminalConfig->EmulationMode == EMULATION_HEX)
ConProcessData = ConProcessDataHex8;
else
ConProcessData = ConProcessData8;
}
}
Permit();
}
/* ConOutputUpdate():
*
* Choose the right raw text output routine for the job.
*/
VOID
ConOutputUpdate()
{
Forbid();
if(Config->CaptureConfig->BufferMode == BUFFERMODE_FLOW)
SaveRaster = SaveRasterDummy;
else
SaveRaster = SaveRasterReal;
if(BufferFrozen || Config->CaptureConfig->BufferMode != BUFFERMODE_FLOW)
{
if(FileCapture)
{
if(PrinterCapture)
{
if(Config->CaptureConfig->CaptureFilterMode && !RawCapture)
CaptureData = CaptureFilteredTo_File_Printer;
else
CaptureData = CaptureRawTo_File_Printer;
}
else
{
if(Config->CaptureConfig->CaptureFilterMode && !RawCapture)
CaptureData = CaptureFilteredTo_File;
else
CaptureData = CaptureRawTo_File;
}
}
else
{
if(PrinterCapture)
{
if(Config->CaptureConfig->CaptureFilterMode && !RawCapture)
CaptureData = CaptureFilteredTo_Printer;
else
CaptureData = CaptureRawTo_Printer;
}
else
CaptureData = NULL;
}
}
else
{
if(FileCapture)
{
if(PrinterCapture)
{
if(Config->CaptureConfig->CaptureFilterMode && !RawCapture)
CaptureData = CaptureFilteredTo_Buffer_File_Printer;
else
CaptureData = CaptureRawTo_Buffer_File_Printer;
}
else
{
if(Config->CaptureConfig->CaptureFilterMode && !RawCapture)
CaptureData = CaptureFilteredTo_Buffer_File;
else
CaptureData = CaptureRawTo_Buffer_File;
}
}
else
{
if(PrinterCapture)
{
if(Config->CaptureConfig->CaptureFilterMode && !RawCapture)
CaptureData = CaptureFilteredTo_Buffer_Printer;
else
CaptureData = CaptureRawTo_Buffer_Printer;
}
else
{
if(Config->CaptureConfig->CaptureFilterMode && !RawCapture)
CaptureData = CaptureFilteredTo_Buffer;
else
CaptureData = CaptureRawTo_Buffer;
}
}
}
if(ControllerActive)
ConOutput = ConOutputPrinter;
else
{
if(CurrentFont == GFX)
ConOutput = ConOutputGFX;
else
ConOutput = ConOutputNormal;
}
if(ReceiveTable)
ConDump = ConOutputTranslate;
else
ConDump = ConOutput;
Permit();
}
/* ConFontScaleUpdate():
*
* Choose the right font scale for the job.
*/
VOID
ConFontScaleUpdate()
{
CurrentFontScale = RasterAttr[CursorY];
FontScalingRequired = FALSE;
CharCellNominator = 1;
if(CurrentCharWidth == SCALE_HALF)
CharCellDenominator = 2;
else
CharCellDenominator = 1;
if(CurrentFontScale == SCALE_ATTR_NORMAL)
{
if(CurrentCharWidth == SCALE_HALF)
{
/* Half of normal width */
LastPrintableColumn = (LastColumn + 1) * 2 - 1;
LastPrintablePixel = (LastPixel + 1) * 2 - 1;
FontScalingRequired = TRUE;
}
else
{
/* Normal width */
LastPrintableColumn = LastColumn;
LastPrintablePixel = LastPixel;
}
}
else
{
if(CurrentCharWidth == SCALE_HALF)
{
/* Half of double width */
LastPrintableColumn = LastColumn;
LastPrintablePixel = LastPixel;
}
else
{
/* Double width */
LastPrintableColumn = ((LastColumn + 1) / 2) - 1;
LastPrintablePixel = ((LastPixel + 1) / 2) - 1;
FontScalingRequired = TRUE;
}
}
}
/* ConTransferUpdate():
*
* Choose the right processing routine for the job.
*/
VOID
ConTransferUpdate()
{
if(Translate_CR_LF)
{
if(XProtocolBase && (TransferBits & XPRS_HOSTMON))
ConTransfer = (CONTRANSFER)ConTransferHost_Translate_CR_LF;
else
ConTransfer = (CONTRANSFER)ConProcess_Translate_CR_LF;
}
else
{
if(XProtocolBase && (TransferBits & XPRS_HOSTMON))
ConTransfer = (CONTRANSFER)ConTransferHost;
else
ConTransfer = (CONTRANSFER)ConProcess;
}
}
/****************************************************************************/
/* ConClear():
*
* Clears the console screen, no matter what emulation is
* currently running.
*/
VOID
ConClear()
{
if(XEmulatorBase && Config->TerminalConfig->EmulationMode == EMULATION_EXTERNAL)
XEmulatorClearConsole(XEM_IO);
else
{
if(Marking)
WindowMarkerStop();
ConRawOutput("\033[2J\033[H");
}
}
/* ConResetFont():
*
* Resets the console font, no matter what emulation is
* currently running.
*/
VOID
ConResetFont()
{
if(XEmulatorBase && Config->TerminalConfig->EmulationMode == EMULATION_EXTERNAL)
XEmulatorResetCharset(XEM_IO);
else
{
if(Marking)
WindowMarkerStop();
CurrentFont = TextFont;
SetFont(RPort,CurrentFont);
ConOutputUpdate();
}
}
/* ConResetStyles():
*
* Resets the console text rendering style, no matter what emulation is
* currently running.
*/
VOID
ConResetStyles()
{
if(XEmulatorBase && Config->TerminalConfig->EmulationMode == EMULATION_EXTERNAL)
XEmulatorResetTextStyles(XEM_IO);
else
{
if(Marking)
WindowMarkerStop();
ConRawOutput("\033[0m");
ObtainSemaphore(&TerminalSemaphore);
ClearCursor();
CurrentCharWidth = SCALE_NORMAL;
if(!Config->EmulationConfig->LockColour)
{
ForegroundPen = GetPenIndex(SafeTextPen);
BackgroundPen = 0;
}
UpdatePens();
ConFontScaleUpdate();
DrawCursor();
ReleaseSemaphore(&TerminalSemaphore);
}
}
/* ConResetTerminal():
*
* Resets the console, no matter what emulation is
* currently running.
*/
VOID
ConResetTerminal()
{
if(XEmulatorBase && Config->TerminalConfig->EmulationMode == EMULATION_EXTERNAL)
XEmulatorResetConsole(XEM_IO);
else
{
if(Marking)
WindowMarkerStop();
ConRawOutput("\033c");
}
}
/* SetConsoleQuiet(BOOL NewSettings):
*
* Tell the console to be quiet.
*/
BOOL
SetConsoleQuiet(BOOL NewSettings)
{
BOOL OldSettings;
OldSettings = ConsoleQuiet;
ConsoleQuiet = NewSettings;
return(OldSettings);
}